// src/utils/http.ts
import axios, {
	AxiosInstance,
	InternalAxiosRequestConfig,
	// AxiosRequestHeaders,
	AxiosResponse,
	CancelTokenSource,
} from 'axios';

// 创建 Axios 实例
const http: AxiosInstance = axios.create({
	baseURL: import.meta.env.PROD ? '' : '/', // 根据环境变量设置基础 URL
	timeout: 5000, // 请求超时时间
});

// 存储取消请求的源
const pendingMap = new Map<string, CancelTokenSource>();

// 添加请求拦截器
http.interceptors.request.use(
	(config: InternalAxiosRequestConfig) => {
		// 自定义请求头
		// 自定义请求头并确保 headers 不为 undefined
		if (!config.headers) {
			config.headers = new axios.AxiosHeaders(); // 使用 AxiosHeaders 构造函数
		}
		config.headers['Custom-Header'] = 'YourValue';

		// 处理重复请求
		const url = `${config.url}&request_type=${config.method}`;
		if (pendingMap.has(url)) {
			const cancelTokenSource = pendingMap.get(url);
			cancelTokenSource?.cancel('Duplicate request detected.');
		}
		const source = axios.CancelToken.source();
		config.cancelToken = source.token;
		pendingMap.set(url, source);

		return config;
	},
	(error) => {
		return Promise.reject(error);
	}
);

// 添加响应拦截器
http.interceptors.response.use(
	(response: AxiosResponse) => {
		// 处理响应数据
		const url = `${response.config.url}&request_type=${response.config.method}`;
		pendingMap.delete(url);
		console.log("响应拦截器", response);
		return response.data;
	},
	(error) => {
		if (axios.isCancel(error)) {
			console.log('Request canceled:', error.message);
		} else {
			// 处理错误响应
			console.error('Error:', error);
		}
		return Promise.reject(error);
	}
);

// 取消所有请求
export const removeAllPending = () => {
	for (const [, cancel] of pendingMap) {
		cancel?.cancel('All requests have been canceled.'); // 使用可选链操作符
	}
	pendingMap.clear();
};

export default http;
